-- stack: in -- format: 8 (HyperCard 1) -- flags: 0x1000 (none) -- protect password hash: 0 -- maximum user level: 5 (scripting) -- window: Rect(x1=0, y1=0, x2=0, y2=0) -- screen: Rect(x1=0, y1=0, x2=0, y2=0) -- card dimensions: w=0 h=0 -- scroll: x=0 y=0 -- background count: 6 -- first background id: 2175 -- card count: 34 -- first card id: 9877 -- list block id: 18180 -- print block id: 13286 -- font table block id: 0 -- style table block id: 0 -- free block count: 0 -- free size: 0 bytes -- total size: 127296 bytes -- stack block size: 23552 bytes -- created by hypercard version: 0x00000000 -- compacted by hypercard version: 0x01208000 -- modified by hypercard version: 0x01208000 -- opened by hypercard version: 0x01208000 -- patterns[0]: 0x0000000000000000 -- patterns[1]: 0x8000000008000000 -- patterns[2]: 0x8800220088002200 -- patterns[3]: 0x8888222288882222 -- patterns[4]: 0x88AA22AA88AA22AA -- patterns[5]: 0xCCAA33AACCAA33AA -- patterns[6]: 0xEEAABBAAEEAABBAA -- patterns[7]: 0xEEBBBBEEEEBBBBEE -- patterns[8]: 0xFFBBFFEEFFBBFFEE -- patterns[9]: 0xFFBBFFFFFFBBFFFF -- patterns[10]: 0x8010022001084004 -- patterns[11]: 0xFFFFFFFFFFFFFFFF -- patterns[12]: 0x8822882288228822 -- patterns[13]: 0x1122448811224488 -- patterns[14]: 0xC4800C6843023026 -- patterns[15]: 0xB130031BD8C00C8D -- patterns[16]: 0xAA00AA00AA00AA00 -- patterns[17]: 0x8822552288225522 -- patterns[18]: 0x8855225588552255 -- patterns[19]: 0x77DD77DD77DD77DD -- patterns[20]: 0x8000000000000000 -- patterns[21]: 0xAA55AA55AA55AA55 -- patterns[22]: 0x038448300C020101 -- patterns[23]: 0x8244394482010101 -- patterns[24]: 0x8814224188412214 -- patterns[25]: 0x8080413E080814E3 -- patterns[26]: 0x22048C7422179810 -- patterns[27]: 0xBE808808EB088880 -- patterns[28]: 0x25C8328964244C92 -- patterns[29]: 0xA29C41BE2AC914EB -- patterns[30]: 0x40A00000040A0000 -- patterns[31]: 0x8040200002040800 -- patterns[32]: 0xAA00800088008000 -- patterns[33]: 0xFF80808080808080 -- patterns[34]: 0x081C22C180010204 -- patterns[35]: 0xFF808080FF080808 -- patterns[36]: 0xF87422478F172271 -- patterns[37]: 0xBF00BFBFB0B0B0B0 -- patterns[38]: 0xFF7FBE5DA2418000 -- patterns[39]: 0xFAF5FAF5A050A050 -- checksum: 0x0 ----- HyperTalk script ----- --Copyright ©1988 - Scott McGilliard - all rights reserved --Thank you to: Andrew Gilmartin (Brown University) for XFCN PopUpMenu on openStack global saveMsg hide msg hide menuBar put loc of msg into saveMsg push card "Expenses" get card field "allExpenses" of card "whichMonths" if it = empty then exit openStack get the date convert it to seconds if it >= line 2 of card field "startMonth" of card "Year Totals" then answer "It's time to recalculate, do it now?" with "No" or "Yes" if it is "Yes" then put last word of the long date into whichYear if word 1 of item 2 of the long date ≠ "January" then put " -" && whichYear + 1 after whichYear set loc of msg to 19,106 put "Estimating expenses for" && whichYear & ", please wait." get line 2 of card field "startMonth" of card "Year Totals" convert it to long date add 1 to last item of it convert it to seconds put it into line 2 of card field "startMonth" of card "Year Totals" doEstimate doMath hide msg end if end if end openStack on idle global moreExpenses if moreExpenses = 1 then addExpense set cursor to 5 pass idle end idle on helpIndex visual venetian blinds to gray visual venetian blinds go card "HelpIndex" end helpIndex on addExpense global expenseAmount,expense,moreExpenses push card Get card field "allExpenses" of card "whichMonths" if the number of lines of it >= 48 then answer "You can not enter more than 48 items" with "OK" get field expense3 of card "Expenses" if line 16 of it = empty then noMore put empty into moreExpenses exit addExpense end if set numberFormat to "0.00" repeat forever ask "Please enter an expense item" repeat if "," is in it then put offset (",",it) into er delete char er of it else exit repeat end if end repeat put it into expenseItem if expenseItem = empty then exit repeat if the length of expenseItem > 18 then answer "Expense items can have only 18 characters" with "OK" exit addExpense end if put expenseItem&"," into expense answer "Do you pay the same amount every time?" with "No" or "Yes" if it is "yes" then repeat forever ask "Please enter the amount for"&&expenseItem if it is empty then answer "Do you want to delete this expense?" with "Yes" or "No" if it is "yes" then put empty into expense exit repeat else next repeat end if else exit repeat end if end repeat if expense = empty then next repeat put "$" into expenseAmount if char 1 of it = "$" then delete char 1 of it repeat if "," is in it then put offset (",",it) into er delete char er of it else exit repeat end if end repeat add 0 to it put it & "," after expenseAmount put expenseAmount after expense answer "Do you pay this expense every month?" with "No" or "Yes" else put "variable," into expenseAmount put expenseAmount after expense end if if it is "yes" and expenseAmount ≠ "variable," then put "Every Month" after expense exit repeat else visual venetian blinds to gray visual venetian blinds go card "whichMonths" put empty into moreExpenses exit addExpense end if end repeat doAlphabet answer "Are you finished adding expenses?" with "Yes" or "No" if it = "yes" then put the number of lines of card field "allExpenses" of card "whichMonths" into test1 put the number of lines of field "expense" of card "Expenses" into test2 add the number of lines of field "expense2" of card "Expenses" to test2 add the number of lines of field "expense3" of card "Expenses" to test2 if test2 < test1 then noMore else put empty into moreExpenses end if end if end addExpense on doAlphabet global expense set cursor to 4 set loc of msg to 19,106 put "Please wait" if expense = empty then hide msg exit doAlphabet end if repeat with x = 1 to the length of item 1 of expense put the charToNum of char x of item 1 of expense into temp if temp >= 97 and temp <= 122 then put temp - 32 into temp put the numToChar of temp into char x of item 1 of expense end if end repeat put card field "allExpenses" of card "whichMonths" into allExpenses if allExpenses = empty then put expense into card field "allExpenses" of card "whichMonths" put empty into expense hide msg exit doAlphabet end if put item 1 of expense into ex put 1 into y put 1 into z repeat if ex = item 1 of line y of allExpenses then answer "You can't enter the same expense item twice." with "OK" ask "Please enter a different name for" && ex if it = ex or it = empty then put empty into expense hide msg exit doAlphabet else repeat if "," is in it then put offset (",",it) into er delete char er of it else exit repeat end if end repeat put it into ex repeat if the length of ex > 18 then delete last char of ex else exit repeat end if end repeat repeat with x = 1 to the length of ex put the charToNum of char x of ex into temp if temp >= 97 and temp <= 122 then put temp - 32 into temp put the numToChar of temp into char x of ex end if end repeat put ex into item 1 of expense put 1 into y put 1 into z end if end if if line y of allExpenses = empty then put return & expense after last line of card field "allExpenses" of card "whichMonths" put empty into expense hide msg exit doAlphabet end if if the charToNum of char z of ex = the charToNum of char z of item 1 of line y of allExpenses then add 1 to z if char z of item 1 of line y of allExpenses = empty then add 1 to y put 1 into z next repeat end if if char z of ex = empty then put expense & return before line y of card field "allExpenses" of card "whichMonths" put empty into expense hide msg exit doAlphabet end if next repeat end if if the charToNum of char z of ex < the charToNum of char z of item 1 of line y of allExpenses then put expense & return before line y of card field "allExpenses" of card "whichMonths" put empty into expense hide msg exit doAlphabet else add 1 to y put "1" into z next repeat end if end repeat hide msg end doAlphabet on noMore global moreExpenses set loc of msg to 19,106 put "This will take a couple of minutes, please wait." put empty into moreExpenses set cursor to 4 set lockScreen to true put card field "allExpenses" of card "whichMonths" into allExpenses repeat with x = 2 to 13 put empty into field expense of card x put empty into field amount of card x put empty into field expense2 of card x put empty into field amount2 of card x end repeat put empty into field expense of card "Expenses" put empty into field expense2 of card "Expenses" put empty into field expense3 of card "Expenses" repeat with i = 1 to the number of lines in allExpenses put item 1 of line i of allExpenses into expenseName put expenseName & return after field expense of card "Expenses" if item 3 of line i of allExpenses = "Every Month" then repeat with x = 2 to 13 put expenseName & return after field expense of card x put item 2 of line i of allExpenses & return after field amount of card x end repeat else if item 2 of line i of allExpenses = "Variable" then repeat with x = 3 to the number of items in line i of allExpenses put word 1 of item x of line i of allExpenses into which put expenseName & return after field expense of card which put last word of item x of line i of allExpenses & return after field amount of card which end repeat else repeat with x = 3 to the number of items in line i of allExpenses put item x of line i of allExpenses into which put expenseName & return after field expense of card which put item 2 of line i of allExpenses & return after field amount of card which end repeat end if end if end repeat repeat with x = 2 to 13 put line 16 to 30 of field expense of card x into field expense2 of card x delete line 16 to 30 of field expense of card x put line 16 to 30 of field amount of card x into field amount2 of card x delete line 16 to 30 of field amount of card x end repeat put line 17 to 32 of field expense of card "Expenses" into field expense2 of card "Expenses" put line 33 to 48 of field expense of card "Expenses" into field expense3 of card "Expenses" delete line 17 to 48 of field expense of card "Expenses" hide msg end noMore on seeItems put card field "allExpenses" of card "whichMonths" into allExpenses put (item 2 of the clickLoc - 39) div 16 into whichLine put the short name of the target into whichField if line whichLine of field whichField is empty then exit seeItems get line whichLine of field whichField repeat with i = 1 to the number of lines in allExpenses if it = item 1 of line i of allExpenses then put line i of allExpenses into theList exit repeat end if end repeat if item 3 of theList = "Every Month" then put "," & card field "monthList" of card "Expenses" after theList put the mouseloc into listHere put item 1 of listHere + 1 into horiz put item 2 of listHere - 10 into vert get the number of items in theList put vert + (it * 17) into length if length > 314 then subtract (length - 324) from vert get PopUpMenu(theList, 1, vert, horiz) put item it of theList into whatCard if it = 1 then visual barn door close slowly to gray visual barn door open slowly go card whatCard if the result ≠ empty then repeat answer "Automatic cost adjustment for this expense?" with "Help" or "Yes" or "No" if it = "Help" then push card visual venetian blinds go card it show card field "Cost" repeat until the mouse is down end repeat visual venetian blinds pop card else exit repeat end if end repeat if it = "Yes" then go card "template" doMenu "New Card" put item 1 of theList into bill set name of this card to bill put "," & bill after line 3 of card field "startMonth" of card "Year Totals" repeat with y = 1 to the number of fields put field y of card "template" into field y of card bill end repeat put bill into field "title" of card bill put field "months" of card bill into tempMon set numberFormat to "0.00" if item 3 of theList = "Every Month" then set numberFormat to "0" ask "Enter amount for"&& bill && "in" && last item of the long date - 1 with item 2 of theList set numberFormat to "0.00" repeat if "," is in it then put offset (",",it) into er delete char er of it else exit repeat end if end repeat if it = empty then put item 2 of the list into it if char 1 of it = "$" then delete char 1 of it add 0 to it put "$" before it repeat with y = 1 to 12 put item 2 of theList into line y of act put it into line y of amo end repeat else if item 2 of theList = "variable" then put theList into oldList repeat with i = 3 to the number of items in theList ask "Enter amount for 1 yr before last" && word 1 of item i of theList with last word of item i of theList repeat if "," is in it then put offset (",",it) into er delete char er of it else exit repeat end if end repeat if it = empty then put last word of item i of theList into it if char 1 of it = "$" then delete char 1 of it add 0 to it put "$" before it repeat with x = 1 to 12 if word 1 of item i of theList = line x of tempMon then exit repeat end repeat put last word of item i of theList into line x of act put it into line x of amo end repeat else put theList into oldList set numberFormat to "0" ask "Enter amount for"&& bill && "in" && last item of the long date - 1 with item 2 of theList repeat if "," is in it then put offset (",",it) into er delete char er of it else exit repeat end if end repeat set numberFormat to "0.00" if it = empty then put item 2 of the list into it if char 1 of it = "$" then delete char 1 of it add 0 to it put "$" before it repeat with i = 3 to the number of items in theList repeat with x = 1 to 12 if word 1 of item i of theList = line x of tempMon then exit repeat end repeat put item 2 of theList into line x of act put it into line x of amo end repeat end if set cursor to 4 end if put act into field "actual" of card bill put amo into field "amount" of card bill put "0" into totalAct put "0" into totalAmo repeat with y = 1 to 12 delete char 1 of line y of act delete char 1 of line y of amo add line y of act to totalAct add line y of amo to totalAmo end repeat set numberFormat to "0.0" put ((totalAct - totalAmo)/totalAmo)*100 into inc if inc < 0 then put 0 into inc put inc & "%" into line 2 of field "increase" of card bill set numberFormat to "0.00" repeat with y = 1 to 12 if line y of act ≠ empty then put "$" & line y of amo + (line y of amo * inc/100) into line y of pro put "$" & line y of amo - (line y of amo * inc/100) into line y of bas end if end repeat put pro into field "projected" of card bill put bas into field "base" of card bill if item 2 of theList = "Variable" then get word 1 of item 2 of the long date repeat with i = 1 to 12 if it = line i of tempMon then exit repeat end repeat put i into t repeat with i = i to 12 put line i of field "actual" of card bill into line i of field "amount" of card bill put line i of field "amount" of card bill into line i of field "base" of card bill if line i of act ≠ empty then put "$" & line i of act + (line i of act * inc/100) into line i of field "projected" of card bill put "$" & line i of act - (line i of act * inc/100) into line i of field "base" of card bill end if put empty into line i of field "actual" of card bill end repeat repeat answer "Estimate" && bill && "and recalculate?" with "Help" or "Yes" or "No" if it = "Help" then push card visual venetian blinds go card it show card field "Estimate" repeat until the mouse is down end repeat visual venetian blinds pop card else exit repeat end if end repeat if it is "Yes" then set loc of msg to 19,106 put "Estimating expense, please wait." repeat with t = t to 12 get line t of field "amount" of card bill if it ≠ empty then put line t of field "projected" of card bill into proAm put proAm into line t of field "actual" of card bill put line t of tempMon into whichMonth repeat with s = 1 to the number of items in theList if whichMonth is in item s of theList then exit repeat end repeat put proAm into last word of item s of theList repeat with y = 1 to 3 if bill is in field y of card whichMonth then repeat with i = 1 to the number of lines in field y of card whichMonth if bill = line i of field y of card whichMonth then put proAm into line i of field (y + 1) of card whichMonth exit repeat end if end repeat exit repeat end if end repeat repeat with i = 1 to the number of lines in allExpenses if bill = item 1 of line i of allExpenses then put theList into line i of card field "allExpenses" of card "whichMonths" exit repeat end if end repeat end if end repeat doMath end if end if end if end if else if whatCard = "Every Month" then answer "You can't go to every month at once." with "OK" exit seeItems else put word 1 of whatCard into whatCard end if visual barn door close slowly to gray visual barn door open slowly go card whatCard end if end seeItems on doEstimate set cursor to 4 put last word of the long date into whichYear if word 1 of item 2 of the long date ≠ "January" then put " -" && whichYear + 1 after whichYear put whichYear into field "thisYear1" of card "template" put whichYear into field "thisYear2" of card "template" put "SUMMARY FOR" && whichYear into card field "title" of card "Year Totals" if whichYear = last word of the long date then put whichYear - 1 into field "lastYear" of card "template" else subtract 1 from first word of whichYear subtract 1 from last word of whichYear put whichYear into field "lastYear" of card "template" end if put card field "allExpenses" of card "whichMonths" into allExpenses put line 3 of card field "startMonth" of card "Year Totals" into whichBill put field "months" of card "template" into tempMon repeat with i = 2 to the number of items in whichBill put item i of whichBill into bill repeat with x = 1 to the number of lines in allExpenses if bill = item 1 of line x of allExpenses then put line x of allExpenses into theList exit repeat end if end repeat put field "thisYear1" of card "template" into field "thisYear1" of card bill put field "thisYear2" of card "template" into field "thisYear2" of card bill put field "lastYear" of card "template" into field "lastYear" of card bill put field "amount" of card bill into amo put field "actual" of card bill into act put field "projected" of card bill into pro repeat with y = 1 to 12 if line y of amo ≠ empty and line y of act = empty then put line y of pro into line y of act end repeat if item 2 of theList ≠ "Variable" then repeat with y = 1 to 12 if line y of act ≠ empty then put line y of act into test exit repeat end if end repeat repeat with y = 1 to 12 if line y of act ≠ empty and line y of act ≠ test then exit repeat end repeat repeat with z = y to 12 if line z of amo ≠ empty then put test into line z of amo end repeat put amo into field "base" of card bill put act into field "amount" of card bill repeat with z = 1 to y - 1 if line z of act ≠ empty then put line y of act into line z of act put line y of act into line z of field "projected" of card bill end if end repeat put line y of act into test2 delete char 1 of test delete char 1 of test2 set numberFormat to "0.0" put ((test2 - test)/test)*100 into inc if inc < 0 then put 0 into inc put inc & "%" into line 2 of field "increase" of card bill set numberFormat to "0.00" repeat with z = y to 12 if line z of amo ≠ empty then delete char 1 of line z of act put "$" & line z of act + (line z of act * inc/100) into line z of field "projected" of card bill put "$" & line z of act + (line z of act * inc/100) into item 2 of theList end if put empty into line z of act end repeat put act into field "actual" of card bill else put amo into field "base" of card bill put act into field "amount" of card bill put empty into field "actual" of card bill put "0" into totalAct put "0" into totalAmo repeat with y = 1 to 12 delete char 1 of line y of act delete char 1 of line y of amo add line y of act to totalAct add line y of amo to totalAmo end repeat set numberFormat to "0.0" put ((totalAct - totalAmo)/totalAmo)*100 into inc if inc < 0 then put 0 into inc put inc & "%" into line 2 of field "increase" of card bill set numberFormat to "0.00" repeat with y = 1 to 12 if line y of amo ≠ empty then put "$" & line y of act + (line y of act * inc/100) into line y of field "projected" of card bill end repeat end if repeat with t = 1 to 12 get line t of field "projected" of card bill if it ≠ empty then put it into proAm put line t of tempMon into whichMonth if item 2 of theList = "variable" then repeat with s = 1 to the number of items in theList if whichMonth is in item s of theList then exit repeat end repeat put proAm into last word of item s of theList end if repeat with y = 1 to 3 if bill is in field y of card whichMonth then repeat with i = 1 to the number of lines in field y of card whichMonth if bill = line i of field y of card whichMonth then put proAm into line i of field (y + 1) of card whichMonth exit repeat end if end repeat exit repeat end if end repeat repeat with i = 1 to the number of lines in allExpenses if bill = item 1 of line i of allExpenses then put theList into line i of card field "allExpenses" of card "whichMonths" exit repeat end if end repeat end if end repeat end repeat end doEstimate on doMath set cursor to 4 set loc of msg to 19,106 put "Calculating, please wait." set numberFormat to "0.00" put "0" into temp4 repeat with x = 2 to 13 put "0" into temp2 repeat with i = 1 to the number of lines in field 2 of card x put line i of field 2 of card x into temp1 delete char 1 of temp1 add temp1 to temp2 end repeat repeat with i = 1 to the number of lines in field 4 of card x put line i of field 4 of card x into temp1 delete char 1 of temp1 add temp1 to temp2 end repeat put "$" & temp2 into field "subTotal" of card x put "$" & temp2 & return after temp3 put temp2 & return after tempAm add temp2 to temp4 end repeat put temp3 into card field "amounts" of card "Year Totals" put "$" & temp4 into card field "Total" of card "Year Totals" put temp4 into deposit divide deposit by 12 put "$" & deposit into card field "deposit/month" of card "Year Totals" get word 1 of card field "pays" of card "Year Totals" put temp4 into eachPay divide eachPay by it put "$" & eachPay into card field "perPay" of card "Year Totals" put "0" into tempDep get line 1 of card field "startMonth" of card "Year Totals" if it = empty then put "January" into line 1 of card field "startMonth" of card "Year Totals" put "template" into line 3 of card field "startMonth" of card "Year Totals" put card field "months" of card "Year Totals" into field "months" of card "template" put "January" && "1," & last item of the long date into startDate convert startDate to dateItems get the date convert it to dateItems set numberFormat to "0" if item 2 of it >= item 2 of startDate then add 1 to item 1 of startDate convert startDate to date convert startDate to seconds put startDate into line 2 of card field "startMonth" of card "Year Totals" put "January" into it end if repeat with i = 1 to 12 if it = line i of card field "months" of card "Year Totals" then exit repeat end repeat set numberFormat to "0.00" repeat 12 add deposit to tempDep put tempDep - line i of tempAm into line i of tempBal put line i of tempBal into tempDep if i = 12 then put 1 into i else add 1 to i end repeat repeat with i = 1 to 12 put "$" before char 1 of line i of tempBal end repeat put tempBal into card field "balance" of card "Year Totals" hide msg end doMath on closeStack global saveMsg if the diskSpace >= size of this stack then get the freeSize of stack if it > 1024 * 10 then put trunc(it/1024) + 1 into extra answer extra & "K of free space...compact stack?" with "Cancel" or "Compact" if it = "Compact" then if the userLevel < 4 then put the userLevel into saveLevel set the userLevel to 5 doMenu "Compact Stack" set the userLevel to saveLevel else doMenu "Compact Stack" end if end if end if end if set loc of msg to saveMsg show menuBar end closeStack